//
//  Problem559.swift
//  TestProject
//
//  Created by 毕武侠 on 2021/6/3.
//  Copyright © 2021 zhulong. All rights reserved.
//

import UIKit

/*
 559. N 叉树的最大深度
 给定一个 N 叉树，找到其最大深度。

 最大深度是指从根节点到最远叶子节点的最长路径上的节点总数。

 N 叉树输入按层序遍历序列化表示，每组子节点由空值分隔（请参见示例）。

 示例 1：
     输入：root = [1,null,3,2,4,null,5,6]
     输出：3
 示例 2：
     输入：root = [1,null,2,3,4,5,null,null,6,7,null,8,null,9,10,null,null,11,null,12,null,13,null,null,14]
     输出：5
 提示：
     树的深度不会超过 1000 。
     树的节点数目位于 [0, 104] 之间。
 */
@objcMembers class Problem559: NSObject {
    func solution() {
        let root = Node(1)
        let node1 = Node(3)
        node1.children = [Node(5), Node(6)]
        root.children = [node1, Node(2), Node(4)]
        print(maxDepthBFS(root))
    }
    
    /*
     DFS 深度优先搜索
     节点root的深度为： 1 + max(child.depth)
     */
    func maxDepth(_ root: Node?) -> Int {
        if root == nil {
            return 0
        } else if root?.children.count == 0 {
            return 1
        }
        
        var maxD:Int = 0
        for child in root!.children {
            maxD = max(maxD, maxDepth(child) + 1)
        }
        return maxD
    }
    
    func maxDepthBFS(_ root: Node?) -> Int {
        if root == nil {
            return 0
        } else if root?.children.count == 0 {
            return 1
        }
        
        var depth = 0
        var list:[Node] = [root!]
        while list.isEmpty == false {
            let tempList = list
            list = []
            for node in tempList {
                list.append(contentsOf: node.children)
            }
            depth += 1
        }
        
        return depth
    }
}
